# -*- coding: utf-8 -*- 
# @project : 《Atcoder》
# @Author : created by bensonrachel on 2021/8/2
# @File : C - chokudai(DP).py

def dp(s:str):
    t = "chokudai"
    len_t = 8
    dp = [[0]*(len(s)+1) for i in range(len_t+1)]
    for i in range(len(s)+1):
        dp[0][i]=1#初始化第一行为全1，因为空和第一个空匹配，后面就没有了。
    for i in range(1,len_t+1):
        dp[i][0]=0#如果输入串为空，则里面不可能有组成方法组成目标串（没有前面的空字符）
    for i in range(1,len_t+1):
        for j in range(1,len(s)+1):
            if(s[j-1]==t[i-1]):
                dp[i][j] = dp[i][j-1]+dp[i-1][j-1]#如果相同，就看输入串除了当前字符前面的字符能组成当前目标串的方法数，即前者，
                #再加上 输入串除了当前字符前面的字符里组成目标串除了当前字符的前面子串的方法数，即后者，因为加上当前输入串的这个值就可以产生新的方法
            else:
                dp[i][j] = dp[i][j-1]#如果不相同，则不变，直接等于输入串除了当前字符前面的字符能组成当前目标串的方法数
    return dp[-1][-1]

if __name__ == "__main__":
    str_S = input()
    res = dp(str_S)
    print(res%1000000007)
"""
非常经典的一道动态规划填表题，空间还可以优化为一维数组。
dp[i][j]表示目标串的前i个在输入串的前j个里出现的组成方法数，
感悟：把子集想明白，把子集递推想明白即可，不用意思了就思考全集。
初始化：
设想两个串前面都有一个空字符（设想的，代码中没有这个空字符）
dp数组的行为目标串，列为输入串
最后输出右下角的值即可。

dp：（例子，初始化之后是这样的）
1 1 1 1 1 1
0 
0
0         res
"""